package com.utf999.qiangmanger.service.iface;

import java.util.List;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import com.utf999.qiangmanger.entity.PageEntity;
import com.utf999.qiangmanger.entity.orm.OrderInfoEntity;
import com.utf999.qiangmanger.exception.BizException;
import com.utf999.qiangmanger.service.IQiangService;

public interface IOrderInfoService extends IQiangService {
	/**
	 * 当一个工单信息录入号以后，通过这个方法添加到服务器中
	 * @param storeid 该工单所属的店面信息
	 * @param roomNo 对应的房间号
	 * @param orderTypeCode 工单类型编号
	 * @param duration 标准服务时间
	 * @param integral 标准积分
	 * @param fenpeiType 工单分配方式。1：抢单模式；2：指派模式
	 * @param usergroupid 抢单模式下，选定的用户组（数组，可以是多个用户组）
	 * @param zhipaiUserid 指派模式下，指派的服务人员编号
	 * @param commodityid 消费工单下，选定的商品信息编号（数组，可以是多个）
	 * @param commodityNumber 消费工单下，选定的每一种商品的购买数量（数组，可以是多个）
	 * @param remark 非消费工单下，说明的工单服务任务
	 */
	public void createOrder(String storeid , String roomNo , String orderTypeCode , Integer duration , Integer integral , Integer fenpeiType , String[] usergroupid , String zhipaiUserid , String[] commodityid , Integer[] commodityNumber , String remark) throws BizException;
	
	/**
	 * 该方法用于建立一个工单对应的一个或者多个用户组信息
	 * @param orderinfoID 工单编号
	 * @param groupid 一个或者多个用户组编号
	 * @throws BizException
	 */
	public void appendOrderInfoGroupMapping(String orderinfoID , String[] groupid) throws BizException;
	
	/**
	 * 当一个指定的工单完成了配货步骤，使用该业务方法更新工单的“配货状态”，和“应付总金额”
	 * @param orderinfoid 指定的工单id
	 * @param totalAmount 应付总金额
	 */
	public void updatePickingStatus(String orderinfoid , Float totalAmount) throws BizException;
	
	/**
	 * 对指定的工单信息，进行核算信息的存储。
	 * @param orderinfoid 指定的工单编号
	 * @param adminuserid 核算人员的编号
	 * @param realIntegral 最后核算的获得积分
	 * @param realTotalAmount 最后核算的消费单实际收费金额
	 * @throws BizException
	 */
	public void saveOrderinfoAccount(String orderinfoid, String adminuserid , Integer realIntegral , Float realTotalAmount) throws BizException;
	
	/**
	 * 批量进行工单核算，注意“消费型”工单不能参与批量核算。所以没有realTotalAmount参数
	 * @param orderinfoids 指定的工单编号，多个
	 * @param adminuserid 核算人员的编号
	 * @param realIntegrals 最后核算的获得积分，多个
	 * @throws BizException
	 */
	public void saveOrderinfoAccounts(String orderinfoid[], String adminuserid , Integer realIntegral[]) throws BizException;
	
	/**
	 * 指定的工单撤回（即指定工单的假删除操作）<br>
	 * 只有当工单类型为“抢单中”、“已指派”的情况下，才能进行撤回<br>
	 * “已完成”、“已结算”的工单，是不能进行撤回的
	 * @param orderinfoid
	 * @throws BizException
	 */
	public void withdrawOrderInfo(String orderinfoid) throws BizException;
	
	/**
	 * 该方法用于查询指定的店面下，还没有完成商品配货的“消费单”信息。
	 * @param storefrontid 指定的店面编号
	 * @throws BizException
	 */
	public List<OrderInfoEntity> queryPickingOrder(String storefrontid) throws BizException;
	
	/**
	 * 该方法用于查询指定的店面下，还没有完成服务的“待办工单”信息
	 * @param storefrontid 指定的店面编号
	 * @param orderMode 可能作为查询条件的派单方式
	 * @param orderStatus 可能作为查询条件的工单状态
	 * @param waiterCode 可能作为查询条件的服务员工号
	 * @param roomNo 可能作为查询条件的房间号
	 */
	public List<OrderInfoEntity> queryTaskOrder(String storefrontid , Integer orderMode , Integer orderStatus , String waiterCode , String roomNo) throws BizException;
	
	/**
	 * 该方法用于查询指定的店面下，已经完成服务等待结算的工单信息
	 * @param storefrontid 指定的店面编号
	 * @param orderMode 可能作为查询条件的派单方式
	 * @param waiterCode 可能作为查询条件的服务员工号
	 * @param roomNo 可能作为查询条件的房间号
	 */
	public JSONArray queryAccountOrders(String storefrontid , Integer orderMode , String waiterCode , String roomNo) throws BizException;
	
	/**
	 * 该方法用于查询指定的已经完成服务等待结算的工单信息。
	 * 包括这个工单的预结算信息
	 * @param orderinfoid 指定的工单编号信息
	 * @return 
	 * @throws BizException
	 */
	public JSONObject queryAccountOrder(String orderinfoid) throws BizException;
	
	/**
	 * 查询指定工单的基本信息，包括可能的工单类型、工单商品
	 * @param orderinfoid 指定的工单编号信息
	 * @return
	 * @throws BizException
	 */
	public OrderInfoEntity queryOrderinfoDetails(String orderinfoid) throws BizException;
	
	/**
	 * 工单报表，只有“归档”状态下的工单才会参与报表统计
	 * @param companyid 报表都是按照店面或者公司为单位进行统计的
	 * @param storefrontid 报表都是按照店面或者公司为单位进行统计的
	 * @param orderMode 可能作为查询条件的派单方式
	 * @param workNumber 可能作为查询条件的服务员工号
	 * @param roomNo 可能作为查询条件的房间号
	 * @param beginFilingTime 可能指定的归档时间的开始点范围
	 * @param endFilingTime 可能指定的归档时间的结束点范围
	 * @param pageNum 分页页码，从0开始
	 * @param maxrow 每页的最大记录数量，如果没有传入则会默认为20
	 * @return 
	 * @throws BizException
	 */
	public PageEntity reportOrderInfo(String companyid , String storefrontid , Integer orderMode , String workNumber , String roomNo , String beginFilingTime , String endFilingTime , Integer pageNum , Integer maxrow) throws BizException;
	
	/**
	 * 人员业绩报表，只有“归档”状态下的工单才会参与报表统计
	 * @param companyid 报表都是按照店面或者公司为单位进行统计的
	 * @param storefrontid 报表都是按照店面或者公司为单位进行统计的
	 * @param orderMode 可能作为查询条件的派单方式
	 * @param workNumber 可能作为查询条件的服务员工号
	 * @param roomNo 可能作为查询条件的房间号
	 * @param beginFilingTime 可能指定的归档时间的开始点范围
	 * @param endFilingTime 可能指定的归档时间的结束点范围
	 * @param pageNum 分页页码，从0开始
	 * @param maxrow 每页的最大记录数量，如果没有传入则会默认为20
	 * @return
	 * @throws BizException
	 */
	public PageEntity reportTotalGroupbyUserid(String companyid , String storefrontid , Integer orderMode , String workNumber , String roomNo , String beginFilingTime , String endFilingTime , Integer pageNum , Integer maxrow) throws BizException;
}
